#ifndef XLCOMM_NET_RPCCODEC_H_
#define XLCOMM_NET_RPCCODEC_H_

#include <functional>

#include "xlcomm/copyable.h"
#include "xlcomm/net/callbacks.h"
#include "xlcomm/net/rpc/rpc.h"

namespace xlcomm {
namespace net {

class RpcCodec : copyable {
 public:
  using RpcCallback = std::function<void(const TcpConnectionPtr&, RpcMeta&)>;

  RpcCodec();

  void OnMessage(const TcpConnectionPtr& conn, Buffer* buff,
                 Timestamp recv_time);

  void Send(const TcpConnectionPtr& conn, const RpcMeta& meta);

  void set_rpc_cb(const RpcCallback& cb) { rpc_cb_ = cb; }

 private:
  const int kHeaderSize = 4;
  RpcCallback rpc_cb_;
};

}  // namespace net
}  // namespace xlcomm

#endif  // XLCOMM_NET_RPCCODEC_H_